//给你一个 m 行 n 列的矩阵 matrix ，请按照 顺时针螺旋顺序 ，返回矩阵中的所有元素。 
//
// 
//
// 示例 1： 
// 
// 
//输入：matrix = [[1,2,3],[4,5,6],[7,8,9]]
//输出：[1,2,3,6,9,8,7,4,5]
// 
//
// 示例 2： 
// 
// 
//输入：matrix = [[1,2,3,4],[5,6,7,8],[9,10,11,12]]
//输出：[1,2,3,4,8,12,11,10,9,5,6,7]
// 
//
// 
//
// 提示： 
//
// 
// m == matrix.length 
// n == matrix[i].length 
// 1 <= m, n <= 10 
// -100 <= matrix[i][j] <= 100 
// 
//
// Related Topics 数组 矩阵 模拟 👍 1476 👎 0

package leetcode.editor.cn;

import java.util.ArrayList;
import java.util.List;

//java:螺旋矩阵
public class Q0054SpiralMatrix {
    public static void main(String[] args){
        Solution solution = new Q0054SpiralMatrix().new Solution();
    }
    //leetcode submit region begin(Prohibit modification and deletion)
class Solution {
    public List<Integer> spiralOrder(int[][] matrix) {
        if (matrix.length == 0) return null;
        List<Integer> res = new ArrayList<>();
        int rawStart = 0, rawEnd = matrix.length - 1, colStart = 0, colEnd = matrix[0].length - 1;
        while (true) {
            for (int i = colStart; i <= colEnd; i++) res.add(matrix[rawStart][i]);
            if (++rawStart > rawEnd) break;

            for (int i = rawStart; i <= rawEnd; i++) res.add(matrix[i][colEnd]);
            if (--colEnd < colStart) break;

            for (int i = colEnd; i >= colStart; i--) res.add(matrix[rawEnd][i]);
            if (rawStart > --rawEnd) break;

            for (int i = rawEnd; i >= rawStart; i--) res.add(matrix[i][colStart]);
            if (++colStart > colEnd) break;
        }
        return res;
    }
}
//leetcode submit region end(Prohibit modification and deletion)

}